/**
 * kl yy-ds @2021
 */
package com.cxps.cloud.message;

import com.cxps.cloud.enums.ApiCode;
import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 数据接口统一响应报文
 *
 * @author YouCai.Liu
 * @since 2021/10/8
 * ...
 */
@Data
public class ApiResponse<T> implements Serializable {

    private static final long serialVersionUID = -2068546959319816577L;

    /**
     * 响应代码 0成功 1失败
     */
    private String code;

    /**
     * 提示消息
     */
    private String msg;

    /**
     * 业务数据
     */
    private T data;

    /**
     * 扩展数据
     */
    private Map<String, Object> extra;

    /**
     * 添加附属数据
     *
     * @param key   键
     * @param value 值
     */
    public ApiResponse<T> addExtra(String key, Object value) {
        if (extra == null) {
            extra = new HashMap<>();
        }
        extra.put(key, value);
        return this;
    }

    /**
     * 成功报文
     *
     * @param code    业务代码
     * @param message 提示消息
     * @param data    业务数据
     * @param <T>     业务泛型
     * @return 报文
     */
    public static <T> ApiResponse<T> fire(String code, String message, T data) {
        ApiResponse<T> response = new ApiResponse<>();
        response.setCode(code);
        response.setMsg(message);
        response.setData(data);
        return response;
    }

    /**
     * 成功报文
     *
     * @param <T> 业务泛型
     * @return 报文
     */
    public static <T> ApiResponse<T> fireSuccess() {
        return fire(ApiCode.SUCCESS.getCode(), ApiCode.SUCCESS.getMessage(), null);
    }

    /**
     * 成功报文
     *
     * @param data 业务数据
     * @param <T>  业务泛型
     * @return 报文
     */
    public static <T> ApiResponse<T> fireSuccess(T data) {
        return fire(ApiCode.SUCCESS.getCode(), ApiCode.SUCCESS.getMessage(), data);
    }

    /**
     * 成功报文
     *
     * @param message 提示消息
     * @param data    业务数据
     * @param <T>     业务泛型
     * @return 报文
     */
    public static <T> ApiResponse<T> fireSuccess(String message, T data) {
        return fire(ApiCode.SUCCESS.getCode(), message, data);
    }

    /**
     * 失败报文
     *
     * @param <T> 业务泛型
     * @return 报文
     */
    public static <T> ApiResponse<T> fireError() {
        return fire(ApiCode.ERROR.getCode(), ApiCode.ERROR.getMessage(), null);
    }

    /**
     * 失败报文
     *
     * @param <T> 业务泛型
     * @return 报文
     */
    public static <T> ApiResponse<T> fireError(String msg) {
        return fire(ApiCode.ERROR.getCode(), msg, null);
    }

    /**
     * 失败报文
     *
     * @param data 业务数据
     * @param <T>  业务泛型
     * @return 报文
     */
    public static <T> ApiResponse<T> fireError(T data) {
        return fire(ApiCode.ERROR.getCode(), ApiCode.ERROR.getMessage(), data);
    }

    /**
     * 失败报文
     *
     * @param message 提示消息
     * @param data    业务数据
     * @param <T>     业务泛型
     * @return 报文
     */
    public static <T> ApiResponse<T> fireError(String message, T data) {
        return fire(ApiCode.ERROR.getCode(), message, data);
    }

}
